#

| Chapter 5 The C Shell |

## 5.2 Syntax

This subsection describes the many symbols peculiar to the C shell. The topics are arranged as follows:

- Special files

- Filename metacharacters

- Quoting

- Command forms

- Redirection forms

### 5.2.1 Special Files

~/.cshrc | Executed at each instance of shell.
~/.history | History list saved from previous login.
~/.login | Executed by login shell after .cshrc at login.
~/.logout | Executed by login shell at logout.
/etc/passwd | Source of home directories for ~`name` abbreviations.

### 5.2.2 Filename Metacharacters

* | Match any string of zero or more characters.
? | Match any single character.
[`abc`...] | Match any one of the enclosed characters; a hyphen can be used to specify a range (e.g., a-z, A-Z, 0-9).
{`abc`,`xxx`,...} | Expand each comma-separated string inside braces.
~ | Home directory for the current user.
~`name` | Home directory of user `name`.

#### 5.2.2.1 Examples

>     % ls new*       Match new and new.1.
>     % cat ch?       Match ch9 but not ch10.
>     % vi [D-R]*     Match files that begin with uppercase D through R.
>     % ls {ch,app}?	 Expand, then match ch1, ch2, app1, app2.
>     % cd ~tom	 Change to tom's home directory.

### 5.2.3 Quoting

Quoting disables a character's special meaning and allows it to be used literally, as itself. The following characters have special meaning to the C shell:

; | Command separator.
& | Background execution.
( ) | Command grouping.
| | Pipe.
* ? [ ] ~ | Filename metacharacters.
{ } | String expansion characters. Usually don't require quoting.
> < & ! | Redirection symbols.
! ^ | History substitution, quick substitution.
" ' \ | Used in quoting other characters.
` | Command substitution.
$ | Variable substitution.
`newline space tab` | Word separators.

The characters below can be used for quoting:

" " | Everything between `"` and `"` is taken literally, except for the following characters that keep their special meaning:

`$`

  Variable substitution will occur.

```

  Command substitution will occur.

`"`

  This marks the end of the double quote.

`\`

  Escape next character.

`!`

  The history character.

' ' | Everything between `'` and `'` is taken literally except for ! (history) and another `'`, and newline.
\ | The character following a \ is taken literally. Use within " " to escape ", $, and `. Often used to escape itself, spaces, or newlines. Always needed to escape a history character (usually !).

#### 5.2.3.1 Examples

>     % echo 'Single quotes "protect" double quotes'
>     Single quotes "protect" double quotes
>     % echo "Well, isn't that \"special\"?"
>     Well, isn't that "special"?
>     % echo "You have `ls|wc -l` files in `pwd`"
>     You have 43 files in /home/bob
>     % echo "The value of \$x is $x"
>     The value of $x is 100

### 5.2.4 Command Forms

`cmd` & | Execute `cmd` in background.
`cmd1` ; `cmd2` | Command sequence; execute multiple `cmd`s on the same line.
(`cmd1` ; `cmd2`) | Subshell; treat `cmd1` and `cmd2` as a command group.
`cmd1` | `cmd2` | Pipe; use output from `cmd1` as input to `cmd2`.
`cmd1` ``cmd2`` | Command substitution; use `cmd2` output as arguments to `cmd1`.
`cmd1` && `cmd2` | AND; execute `cmd1` and then (if `cmd1` succeeds) `cmd2`.
`cmd1` || `cmd2` | OR; execute either `cmd1` or (if `cmd1` fails) `cmd2`.

#### 5.2.4.1 Examples

>     % nroff file &	Format in the background.
>     % cd; ls	Execute sequentially.
>     % (date; who; pwd) > logfile	All output is redirected.
>     % sort file | pr -3 | lp	Sort file, page output, then print.
>     % vi `grep -l ifdef *.c`	Edit files found by grep.
>     % egrep '(yes|no)' `cat list`	Specify a list of files to search.
>     % grep XX file && lp file	Print file if it contains the pattern,
>     % grep XX file || echo XX not found	otherwise, echo an error message.

### 5.2.5 Redirection Forms

File |  | Common | Typical
--- | --- | --- | ---
Descriptor | Name | Abbreviation | Default
0 | Standard Input | stdin | Keyboard
1 | Standard Output | stdout | Terminal
2 | Standard Error | stderr | Terminal

The usual input source or output destination can be changed as follows:

#### 5.2.5.1 Simple Redirection

`cmd` > `file` | Send output of `cmd` to `file` (overwrite).
`cmd` >! `file` | Same as above, even if noclobber is set.
`cmd` >> `file` | Send output of `cmd` to `file` (append).
`cmd` >>! `file` | Same as above, but create `file` even if noclobber is set.
`cmd` < `file` | Take input for `cmd` from `file`.
`cmd` << `text` | Read standard input up to a line identical to `text` (`text` can be stored in a shell variable).Input is usually typed on the screen or in the shell program. Commands that typically use this syntax include cat, echo, ex, and sed. If `text` is enclosed in quotes, standard input will not undergo variable substitution, command substitution, etc.

#### 5.2.5.2 Multiple Redirection

`cmd` >& `file` | Send both standard output and standard error to `file`.
`cmd` >&! `file` | Same as above, even if noclobber is set.
`cmd` >>& `file` | Append standard output and standard error to end of `file`.
`cmd` >>&! `file` | Same as above, but create `file` even if noclobber is set.
`cmd1` |& `cmd2` | Pipe standard error together with standard output.
(`cmd` > `f1`) >& `f2` | Send standard output to file `f1`; standard error to file `f2`.
`cmd` | tee `files` | Send output of `cmd` to standard output (usually the terminal) and to `files`. (See the example in Section 2 under tee.)

#### 5.2.5.3 Examples

>     % cat part1 > book
>     % cat part2 part3 >> book
>     % mail tim < report
>     % cc calc.c >& error_out
>     % cc newcalc.c >&! error_out
>     % grep UNIX ch* |& pr
>     % (find / -print > filelist) >& no_access

>     % sed 's/^/XX /g' << "END_ARCHIVE"
>     This is often how a shell archive is "wrapped",
>     bundling text for distribution.  You would normally
>     run sed from a shell program, not from the command line.
>     "END_ARCHIVE"
>     XX This is often how a shell archive is "wrapped",
>     XX bundling text for distribution.  You would normally
>     XX run sed from a shell program, not from the command line.

5.1 Overview of Features |  | 5.3 Variables